package ca.etsmtl.log430.lab3.gestion.ifaces;

import java.util.Collection;

import ca.etsmtl.log430.lab3.gestion.Course;
import ca.etsmtl.log430.lab3.gestion.TeacherAssignmentException;
import ca.etsmtl.log430.lab3.gestion.TeacherType;

/**
 * @author  samuel
 */
public interface ITeacher {

	/**
	 * @return
	 * @uml.property  name="teacherType"
	 * @uml.associationEnd  
	 */
	public abstract TeacherType getTeacherType();

	/**
	 * 
	 * @return
	 */
	public abstract Collection<ICourse> getCoursesAssignedList();

	/**
	 * 
	 * @return
	 */
	public abstract int getNumberOfCourseAssign();

	/**
	 * Registers a teacher for a course by adding a student for a course. 
	 *  <br>
	 *  VALIDATION 1<br>
	 *  <br>
	 *  Valider qu'un meme cours n'est pas attribuer 2 fois a un professeur. 
	 *  la validation 1 n'est pas necessaire puisque la validation 2 va indiquer un conflit d'horraire mais pour permetre
	 *  a l'usager de mieux situer son erreur on effectue tout de meme la validation <br>
	 *  <br>
	 *  VALIDATION 2<br>
	 *  conflit d'horaire � vous devez v�rifier � chaque fois que le cours ou laboratoire qu�on assigne � un 
	 *	enseignant n'entre pas en conflit avec un autre  cours ou laboratoire d�j� assign� au m�me enseignant. 
	 * <br>
	 *  VALIDATION 3<br>
	 * 	limite de cours � attribuer � un enseignant � si l�enseignant a le statut de professeur (PRF), on ne 
	 *	peut lui assigner plus de trois (3) cours dans une m�me ann�e.
		<br>
		VALIDATION 4<br>
	 *	 Si l�enseignant est un charg� de 
	 *	cours (CHR), on ne peut lui assigner plus de cinq (5) cours dans une m�me ann�e. Notez que les 
	 *	laboratoires n'affectent pas cette r�gle, seulement les cours. Un prof peut donner trois cours plus 
	 *	des laboratoires, mais pas plus de trois  cours. Un charg� peut donner cinq cours plus des 
	 *	laboratoires, mais pas plus de cinq cours. 
	 * <br>
	 * 
	 * @param course
	 * @throws TeacherAssignmentException 
	 */
	public abstract boolean assignCourse(ICourse course)
			throws TeacherAssignmentException; // Register

	/**
	 * @return
	 * @uml.property  name="lastName"
	 */
	public abstract String getLastName();

	/**
	 * @return
	 * @uml.property  name="firstName"
	 */
	public abstract String getFirstName();

	/**
	 * @return
	 * @uml.property  name="teacherID"
	 */
	public abstract String getTeacherID();

	/**
	 * 
	 * @return
	 */
	public abstract Collection<String> getCoursesTaughtList();

	/**
	 * 
	 * @return
	 */
	public abstract Collection<ICourse> getCoursesAssigned();

	/**
	 * 
	 * @param course
	 */
	public abstract void addCourseToBeTaught(Course course);

	/**
	 * 
	 * @param courseId
	 */
	public abstract void addCourseToBeTaught(String courseId);

}